Add api to ellipsize labels to multiple lines
authorMatthias Clasen <mclasen@redhat.com>
Fri, 23 Aug 2013 00:29:22 +0000 (20:29 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 23 Aug 2013 00:38:01 +0000 (20:38 -0400)
When setting the lines property, the label will be ellipsized
to that many lines, with the ellipsis only appearing in the
last line. This is different from how ellipsization of multi-line
labels normally works in GTK+.

docs/reference/gtk/gtk3-sections.txt
gtk/gtklabel.c
gtk/gtklabel.h

index 73d2b7fe0cf2e2b81268d3b7121673e7c0262b91..12e0825444cd27447f987a7ee0d76cab91fcb451 100644 (file)
@@ -2055,6 +2055,7 @@ gtk_label_set_width_chars
 gtk_label_set_max_width_chars
 gtk_label_set_line_wrap
 gtk_label_set_line_wrap_mode
+gtk_label_set_lines
 gtk_label_get_layout_offsets
 gtk_label_get_mnemonic_keyval
 gtk_label_get_selectable
@@ -2073,6 +2074,7 @@ gtk_label_get_label
 gtk_label_get_layout
 gtk_label_get_line_wrap
 gtk_label_get_line_wrap_mode
+gtk_label_get_lines
 gtk_label_get_mnemonic_widget
 gtk_label_get_selection_bounds
 gtk_label_get_use_markup
index b268c4e92aa1dec31cbc6acbf2eddc216b9974ce..0a1b32c8de5821fca731c9aa2e89ad85f7283f1c 100644 (file)
@@ -265,6 +265,7 @@ struct _GtkLabelPrivate
 
   gint     width_chars;
   gint     max_width_chars;
+  gint     lines;
 };
 
 /* Notes about the handling of links:
@@ -355,7 +356,8 @@ enum {
   PROP_SINGLE_LINE_MODE,
   PROP_ANGLE,
   PROP_MAX_WIDTH_CHARS,
-  PROP_TRACK_VISITED_LINKS
+  PROP_TRACK_VISITED_LINKS,
+  PROP_LINES
 };
 
 /* When rotating ellipsizable text we want the natural size to request 
@@ -961,6 +963,26 @@ gtk_label_class_init (GtkLabelClass *class)
                                                          P_("Whether visited links should be tracked"),
                                                          TRUE,
                                                          GTK_PARAM_READWRITE));
+
+  /**
+   * GtkLabel:lines:
+   *
+   * The number of lines to which an ellipsized, wrapping label
+   * should be limited. This property has no effect if the
+   * label is not wrapping or ellipsized. Set this property to
+   * -1 if you don't want to limit the number of lines.
+   *
+   * Since: 3.10
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_LINES,
+                                   g_param_spec_int ("lines",
+                                                     P_("Number of lines"),
+                                                     P_("The desired number of lines, when ellipsizing a wrapping label"),
+                                                     -1,
+                                                     G_MAXINT,
+                                                     -1,
+                                                     GTK_PARAM_READWRITE));
   /*
    * Key bindings
    */
@@ -1138,6 +1160,9 @@ gtk_label_set_property (GObject      *object,
     case PROP_TRACK_VISITED_LINKS:
       gtk_label_set_track_visited_links (label, g_value_get_boolean (value));
       break;
+    case PROP_LINES:
+      gtk_label_set_lines (label, g_value_get_int (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1209,6 +1234,9 @@ gtk_label_get_property (GObject     *object,
     case PROP_TRACK_VISITED_LINKS:
       g_value_set_boolean (value, gtk_label_get_track_visited_links (label));
       break;
+    case PROP_LINES:
+      g_value_set_int (value, gtk_label_get_lines (label));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -3432,6 +3460,8 @@ gtk_label_ensure_layout (GtkLabel *label)
       pango_layout_set_ellipsize (priv->layout, priv->ellipsize);
       pango_layout_set_wrap (priv->layout, priv->wrap_mode);
       pango_layout_set_single_paragraph_mode (priv->layout, priv->single_line_mode);
+      if (priv->lines > 0)
+        pango_layout_set_height (priv->layout, - priv->lines);
 
       gtk_label_update_layout_width (label);
     }
@@ -6533,3 +6563,52 @@ _gtk_label_get_selection_bound (GtkLabel *label)
 
   return 0;
 }
+
+/**
+ * gtk_label_set_lines:
+ * @label: a #GtkLabel
+ * @lines: the desired number of lines, or -1
+ *
+ * Sets the number of lines to which an ellipsized, wrapping label
+ * should be limited. This has no effect if the label is not wrapping
+ * or ellipsized. Set this to -1 if you don't want to limit the
+ * number of lines.
+ *
+ * Since: 3.10
+ */
+void
+gtk_label_set_lines (GtkLabel *label,
+                     gint      lines)
+{
+  GtkLabelPrivate *priv;
+
+  g_return_if_fail (GTK_IS_LABEL (label));
+
+  priv = label->priv;
+
+  if (priv->lines != lines)
+    {
+      priv->lines = lines;
+      g_object_notify (G_OBJECT (label), "lines");
+      gtk_widget_queue_resize (GTK_WIDGET (label));
+    }
+}
+
+/**
+ * gtk_label_get_lines:
+ * @label: a #GtkLabel
+ *
+ * Gets the number of lines to which an ellipsized, wrapping
+ * label should be limited. See gtk_label_set_lines().
+ *
+ * Returns: The number of lines
+ *
+ * Since: 3.10
+ */
+gint
+gtk_label_get_lines (GtkLabel *label)
+{
+  g_return_if_fail (GTK_IS_LABEL (label));
+
+  return label->priv->lines;
+}
index 1e5cfe976f8652513f34a8ec479fcca01c138665..eecb8e8cb9b145e29cfc67b8c2a04567ba3ef679 100644 (file)
@@ -155,6 +155,11 @@ void     gtk_label_set_max_width_chars       (GtkLabel         *label,
                                                   gint              n_chars);
 GDK_AVAILABLE_IN_ALL
 gint     gtk_label_get_max_width_chars           (GtkLabel         *label);
+GDK_AVAILABLE_IN_3_10
+void     gtk_label_set_lines                      (GtkLabel         *label,
+                                                   gint              lines);
+GDK_AVAILABLE_IN_3_10
+gint     gtk_label_get_lines                      (GtkLabel         *label);
 GDK_AVAILABLE_IN_ALL
 void     gtk_label_set_pattern                    (GtkLabel         *label,
                                                   const gchar      *pattern);